home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 21
/
Cream of the Crop 21 (Terry Blount) (October 1996).iso
/
comm
/
msged400.zip
/
src
/
menu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-22
|
14KB
|
438 lines
/*
* MENU.C
*
* Written on 10-Jul-94 by John Dennis and released to the public domain.
*
* Moving bar menu code for Msged.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "msged.h"
#include "main.h"
#include "keys.h"
#include "strextra.h"
void SelShowItem(char *text, int y, int len, int Attr, int indent)
{
char line[256];
memset(line, ' ', 40);
strcpy(line + indent, text);
WPutsn(indent, y, len, Attr, line);
}
void SelShowPage(char **text, int top, int bot, int len, int pos, int Attr, int indent)
{
int i;
int y = top;
for (i = pos; text[i] != NULL; i++)
{
if (y > bot)
break;
SelShowItem(text[i], y++, len, Attr, indent);
}
if (y <= bot)
{
while (y <= bot)
SelShowItem(" ", y++, len, Attr, indent);
}
}
void CalcDef(int max, int cur, int *top, int miny, int maxy, int *y)
{
int dif = maxy - miny;
unused(cur);
if ((max - 1) - *top < dif && max > dif)
{
*y = maxy;
*top = (max - 1) - dif;
}
}
int SelBox(char **Itms, int y1, int y2, int len, int def, WND * hPrev, WND * hWnd, int Sel, int Norm, int selbox_id, char *topMsg)
{
EVT e;
char find[30];
int itemCnt, Stuff, done, curY, Msg, currItem, Top, page, i;
itemCnt = 0;
Stuff = 0;
for (i = 0; Itms[i] != NULL; i++)
itemCnt++;
if (itemCnt < y2)
{
y2 = itemCnt;
}
currItem = def;
curY = y1;
page = y2 - y1;
Top = currItem;
if (currItem + y1 < y1)
{
curY = y1 + currItem;
Top = 0;
}
else
{
if ((itemCnt - currItem) <= (y2 - y1))
{
Top -= ((y2 - y1 + 1) - (itemCnt - Top));
curY = y1 + (def - Top);
if (Top < 0)
{
Top = 0;
curY--;
}
}
}
done = 0;
SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
SelShowItem(Itms[currItem], curY, len, Sel, 1);
TTClearQue(); /* clear input queue */
memset(find, '\0', sizeof find);
while (!done)
{
if (*topMsg && selbox_id == SELBOX_REPLYOTH && !*find)
{
WCurr(hPrev);
WClear(strlen(topMsg) + 4, 0, maxx - 33, 0, cm[CM_NINF]);
WPrintf(0, 0, cm[MN_NTXT], ">>%s:", topMsg);
WCurr(hWnd);
}
if (!Stuff)
{
Msg = MnuGetMsg(&e, hWnd->wid);
}
else
{
e.msgtype = WM_CHAR;
Msg = Stuff;
Stuff = 0;
}
switch (e.msgtype)
{
case WM_MOUSE:
switch (Msg)
{
case RMOU_CLCK:
case MOU_RBTUP:
return -1;
case LMOU_RPT:
case MOU_LBTDN:
/* case MOU_LBTUP: */
case LMOU_CLCK:
/* case MOUSE_EVT: */
{
int x, y;
WndGetRel(e.x, e.y, &x, &y);
if (y >= y1 && y <= y2) /* in window */
{
Stuff = 0;
if (x >= 0 && x < len)
{
if (y == curY)
{
if (Msg == LMOU_CLCK || Msg == MOU_LBTUP)
return currItem;
else
continue;
}
SelShowItem(Itms[currItem], curY, len, Norm, 1);
if (y > curY)
currItem += y - curY;
else
currItem -= curY - y;
curY = y;
SelShowItem(Itms[currItem], curY, len, Sel, 1);
if (Msg == LMOU_CLCK || Msg == MOU_LBTUP)
return currItem;
}
}
else
{
if (Msg != LMOU_CLCK)
{
if (y < y1)
{
Stuff = Key_Up;
}
else
{
Stuff = Key_Dwn;
}
}
}
}
memset(find, '\0', sizeof find);
break;
default:
break;
}
break;
case WM_CHAR:
switch (Msg)
{
case Key_Home:
if (!currItem)
break;
SelShowItem(Itms[currItem], curY, len, Norm, 1);
currItem = 0;
Top = 0;
curY = y1;
SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
SelShowItem(Itms[currItem], curY, len, Sel, 1);
memset(find, '\0', sizeof find);
break;
case Key_End:
if (currItem == itemCnt - 1)
break;
SelShowItem(Itms[currItem], curY, len, Norm, 1);
currItem = itemCnt - 1;
while (currItem && currItem >= (itemCnt - page))
currItem--;
Top = currItem;
currItem = itemCnt - 1;
curY = currItem - Top + y1;
CalcDef(itemCnt, currItem, &Top, y1, y2, &curY);
SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
SelShowItem(Itms[currItem], curY, len, Sel, 1);
memset(find, '\0', sizeof find);
break;
case Key_Dwn:
if (currItem == itemCnt - 1)
break;
SelShowItem(Itms[currItem], curY, len, Norm, 1);
currItem++;
if (curY == y2)
{
WScroll(1, y1, len - 1, y2, 1);
Top++;
}
else
curY++;
SelShowItem(Itms[currItem], curY, len, Sel, 1);
memset(find, '\0', sizeof find);
break;
case Key_Up:
if (!currItem)
break;
SelShowItem(Itms[currItem], curY, len, Norm, 1);
currItem--;
if (curY == y1)
{
WScroll(1, y1, len - 1, y2, 0);
if (Top)
Top--;
}
else
curY--;
SelShowItem(Itms[currItem], curY, len, Sel, 1);
memset(find, '\0', sizeof find);
break;
case Key_PgUp:
if (!currItem)
break;
SelShowItem(Itms[currItem], curY, len, Norm, 1);
if ((currItem -= page) < 0)
currItem = 0;
Top = currItem;
curY = y1;
SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
SelShowItem(Itms[currItem], curY, len, Sel, 1);
memset(find, '\0', sizeof find);
break;
case Key_PgDn:
if (currItem == itemCnt - 1)
break;
SelShowItem(Itms[currItem], curY, len, Norm, 1);
Top = currItem;
if ((currItem += page) > itemCnt - 1)
currItem = itemCnt - 1;
curY = currItem - Top + y1;
CalcDef(itemCnt, currItem, &Top, y1, y2, &curY);
SelShowPage(Itms, y1, y2, len, Top, Norm, 1);